//
//  LWUserAccountViewModel.swift
//  Microblog
//
//  Created by Roman on 17/1/8.
//  Copyright © 2017年 Roman. All rights reserved.
//

import UIKit
//新浪微博一次可以登录多少个用户?

private let path = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("account.plist")

class LWUserAccountViewModel: NSObject {
    
    //设计单例对象
    static let shard : LWUserAccountViewModel = LWUserAccountViewModel()
    
    //持有 数据模型
    var account: LWUserAccountModel?
    
    //定义access_token属性
    var access_token: String?{
        return self.account?.access_token
    }

    
    //确保模型在单例对象一旦实例化就有值
    //单例对象只会实例化一次.
    override init(){
        super.init()
        //给userAccount 赋值  确保用户在登录的情况下能够给单例对象的模型赋值
        self.account = self.loadUserAccount()
    }
    
    //增加一个用户URL 头像的地址
    var headURL:URL? {
        return URL(string: account?.avatar_large ?? "")
    }
    
    //封装数据的业务逻辑处理
    //判断用户是否登录
    //用户的token 不为nil 并且没有过期
    //token的过期日期 expires_date 大于当前日期 才没有过期
    
    //判断用户是否登录
    var userLogin: Bool{
        if account?.access_token != nil && isExpires == false{
            return true
        }
        return false
    }
    
    //判断tock 是否过期  //token的过期日期 expires_date 大于当前日期 才没有过期
    var isExpires: Bool{
        //2017.01.20  2017.01.11
        /*  compare
         public enum ComparisonResult : Int {
         case orderedAscending
         case orderedSame
         case orderedDescending
         }
         */
        if account?.expires_date?.compare(Date()) == .orderedDescending{
             //满足降序就认为没有过期
            return false
        }
        //默认过期
        return true
    }
    


    
    
    //视图模型
    //1. 封装网络请求
    //2.通过Code 请求令牌
    func loadAccessToken(code: String, finshed: @escaping (Bool) -> ())  {
        //请求接口 获取令牌
        let urlString = "https://api.weibo.com/oauth2/access_token"
        let dict = ["client_id":client_id,
                    "client_secret":client_secret,
                    "grant_type":"authorization_code",
                    "code":code,
                    "redirect_uri":redirect_uri]
        
        
        HMNetworkTools.shared.request(method: .POST, urlString: urlString, parameters: dict) { (responseObject, error) in
            if error != nil{
               //执行闭包
                finshed(false)
                return
            }
            
            //请求成功 AFN内部会将二进制的数据反序列化成为json数据
            //print(responseObject!)
            //3.通过令牌请求用户信息
            self.loadUserInfo(dict: responseObject as! [String : Any],loadUserInfofinshed: finshed)
            //可能用户信息都没有拿到
            //finshed(true) 最好咋一下面获取信息后然后再调用
        }
    }
    
    //3.通过令牌请求用户信息
    private func loadUserInfo(dict : [String :Any],loadUserInfofinshed: @escaping (Bool) -> ()){
        //参数: access_token  uid  加!进行强制解包,使下面parameters 打印出来不会出现 Optional
        let access_token = dict["access_token"]!
        let uid = dict["uid"]!
        
        let parameters = ["access_token":access_token,
                          "uid":uid]
        print(parameters)
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        HMNetworkTools.shared.request(method: .GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
            if error != nil{
               // SVProgressHUD.showError(withStatus: "没有网络,登录失败!")
                return
            }
            //请求成功
            //3.1 将授权信息和用户信息进行合并
            var userInfoDict = responseObject as! [String : Any]
            for (key,value) in dict{
                userInfoDict[key] = value
            }
            
            //3.2 将所有的信息转换为模型数据
            let userAccount = LWUserAccountModel(dict: userInfoDict)

            //4. 将模型数据通过归档的方式存储到沙盒中 将用户信息在本地保存(方便以后使用)/服务器保存(没有服务器不做)
            //调用归档的方法
            //直接给单例对象的account属性赋值
            self.account = userAccount
            self.saveUserAccount(account: userAccount)
            loadUserInfofinshed(true)
        }
    }
    
    
   

    
    //3. 封装数据缓存和数据获取的操作
    private func saveUserAccount(account: LWUserAccountModel){
        //归档 到沙盒中Document/Library
        //拼接文件路径的方法 在String中并没有 需要转换为NSString AS前面的对象不能为可选对象
        
        NSKeyedArchiver.archiveRootObject(account, toFile: path)
        
        print(path)
        
    }
    
    //解档的方式获取用户信息的模型
    func loadUserAccount() -> LWUserAccountModel?{
        
        
        print(path)
        
        if let casheAccount = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? LWUserAccountModel {
            
            //如果解档不为nil  并且能够转换为HMUserAccount类型的对象 就任务用户用户的信息就能够获取
            return casheAccount
            
        }

        //无法获取用户模型对象
        return nil
        
    }
    
    
    

}
